package gui;

import Controleur.Controleur;
import Controleur.FileManager;
import Controleur.Historique;

import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;

import javax.management.JMException;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;

import modele.Snapshot;

import Events.TranslateEvent;
import Events.ZoomEvent;

public class Frame extends JFrame {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 6518575355930072980L;
	private JMenuBar menuBar = new JMenuBar();
	private JMenu fichier = new JMenu("Fichier");
	private JMenu image = new JMenu("Image");
	private JMenu perspective1 = new JMenu("perspective1");
	private JMenu perspective2 = new JMenu("perspective2");
	
	private JMenuItem ouvrirImage = new JMenuItem("Ouvrir une image");
	private JMenuItem ouvrirPers = new JMenuItem("Ouvrir les perspectives");
	private JMenuItem sauverPers = new JMenuItem("Sauvegarder les perspectives");
	private JMenuItem fermer = new JMenuItem("Fermer");
	private JMenuItem nouvelleImage = new JMenuItem("Nouvelle image");
	
	private JMenuItem zoom1 = new JMenuItem("Zoom");
	private JMenuItem zoom2 = new JMenuItem("Zoom");
	private JMenuItem dezoom1 = new JMenuItem("Dezoom");
	private JMenuItem dezoom2 = new JMenuItem("Dezoom");
	private JMenuItem translation1 = new JMenuItem("Translation");
	private JMenuItem translation2 = new JMenuItem("Translation");
	
	private AbstractVue vue1 = new Vue1();
	private AbstractVue vue2 = new Vue2();
	private AbstractVue vignette = new Vignette();
	private ArrayList<Snapshot> snap;
    
	public static void main(String[] args) {
        Frame frame = new Frame();
        
         //on affiche la fen�tre
         frame.setVisible(true);                       
    }
		
	public Frame(){
		this.setSize(500, 500);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);
			
		//On initialise nos menus
		//--------------------------
			
		this.fichier.add(sauverPers);
		this.fichier.add(ouvrirPers);
		this.fichier.addSeparator();
		
		this.fichier.add(ouvrirImage);
		this.fichier.add(fermer);
		
		this.image.add(nouvelleImage);

		
		this.perspective1.add(zoom1);
		this.perspective2.add(zoom2);

		
		this.image.add(this.perspective1);
		this.image.add(this.perspective2);
		
		this.menuBar.add(fichier);
		this.menuBar.add(image);
		
		this.setJMenuBar(menuBar);
		this.setVisible(true);
		
		final JTabbedPane onglet = new JTabbedPane(JTabbedPane.LEFT);

		onglet.add("Vignette",vignette);
		onglet.add("Perspective1",vue1);
		onglet.add("Perspective2",vue2);
		
		sauverPers.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0){
				ArrayList<Snapshot> tableauSnapshot = new ArrayList<Snapshot>();
				tableauSnapshot.add(vue1.getControleur().getLatestSnapshot());
				tableauSnapshot.add(vue2.getControleur().getLatestSnapshot());
				tableauSnapshot.add(vignette.getControleur().getLatestSnapshot());
				FileManager.sauvegarder(tableauSnapshot);
				
			}
			
		});
		
		ouvrirPers.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0){
				snap = FileManager.charger();
				vue1.getControleur().getModele().setSnapshot(snap.get(0));
				vue2.getControleur().getModele().setSnapshot(snap.get(1));
				vignette.getControleur().getModele().setSnapshot(snap.get(2));

			}
			
			
		});
		

		
		zoom1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				
				String pourcentageString;
				
				pourcentageString = JOptionPane.showInputDialog(null,"Zoomer de combien de pourcentage(entre 1 et 100)",null);
				int pourcentage = Integer.parseInt(pourcentageString);
				vue1.controleur.executeEvent(new ZoomEvent(pourcentage,vue1.controleur.getModele()));
			}				
		});
		zoom2.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				
				String pourcentageString;
				
				pourcentageString = JOptionPane.showInputDialog(null,"Zoomer de combien de pourcentage(entre 1 et 100)",null);
				int pourcentage = Integer.parseInt(pourcentageString);
				
				vue2.controleur.executeEvent(new ZoomEvent(pourcentage,vue2.controleur.getModele()));

			}				
		});
		
		fermer.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				System.exit(0);
			}				
		});
		
		ouvrirImage.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				String path = loadImage();

				try {
					vue1.controleur.getModele().loadImage(path);
					vue2.controleur.getModele().loadImage(path);
					vignette.controleur.getModele().loadImage(path);
					
					vue1.getControleur().addToHistory();
					vue2.getControleur().addToHistory();
					vignette.getControleur().addToHistory();

				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}

			private String loadImage() {

				JFileChooser jf = new JFileChooser(".");
				int val = jf.showOpenDialog(null);//Affiche la fenetre d'ouverture
				boolean choix_fait = false;
				String nomFichier = null;
				
				//On attend que le choix se fait avant de faire disparaitre
				//la boite de dialogue.
				while(choix_fait==false){
					
					if (val==JFileChooser.APPROVE_OPTION){
						nomFichier = jf.getSelectedFile().getAbsolutePath();
						choix_fait = true;
					}
					else{
						choix_fait = true;
					}
				}
				
				return nomFichier;
			}
		});

		//on passe ensuite les onglets au contentPane
		this.getContentPane().add(onglet);
		this.setVisible(true);
		
		KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
		manager.addKeyEventDispatcher(new KeyEventDispatcher() {
			
			@Override
			public boolean dispatchKeyEvent(KeyEvent arg0) {

				AbstractVue vue = (AbstractVue)(onglet.getSelectedComponent());
				Controleur controleur = vue.controleur;
				Snapshot s;

				if(arg0.getID() == KeyEvent.KEY_TYPED){
//					System.out.println("key typed");
					
					if(arg0.getKeyChar() == 'z'){
						
						s = controleur.undoFromHistory();
						if(s != null)
							controleur.getModele().setSnapshot(s);
						
					}else if(arg0.getKeyChar() == 'y'){
						
						s = controleur.redoFromHistory();
						if(s != null)
							controleur.getModele().setSnapshot(s);
					}
				}

				return false;
			}
		});

			
		}
	
	 
}